You need to think about where in-line assembly may appear.
For example, if it appears inside a for loop:
Code:
for (int i = 0; i < 10; ++i) {
__asm__("movl %eax, %edx")
}
You need to keep in mind that
GCC does not parse the assembly code. So while you look at that and say, "Oh, eax is overwritten by the assembly", GCC looks at it and says, "Ehh, here's a blob of string data that I don't understand. I'll just hand it to the assembler."
But it's possible that the C-language parts of GCC might say, "Hey, this is a simple count loop from 0 to 10. Let's optimize this and not store the index variable on the stack, but instead we'll just keep it in the AX register!
Which would be a great idea, except that the inline assembly "clobbers" the AX register. I wonder why the loop doesn't work like expected?
That is why there is a parseable mechanism for you to tell GCC, "hey, this blob of text will clobber the AX register!" So it can decide, "Ehh, instead of putting our index in AX, let's use BX instead!" That way, you are able to clobber the registers you want, and GCC can store the values it wants to store in safe registers unlikely to get clobbered.